#!/usr/bin/env python
# -*- coding: utf-8 -*-
import jieba
import jieba.analyse
import codecs
import re
from collections import Counter


class WordCounter(object):
    # 参数为文件路径，以及输出词汇个数
    def count_from_file(self, file, top_limit=0):
        # 打开文件
        with codecs.open(file, 'r', 'utf-8') as f:
            # 读取文件，赋给content
            content = f.read()
            # 通过正则将连续的符号替换为空格，避免干扰结果
            content = re.sub(r'\s+', r' ', content)
            content = re.sub(r'\.+', r' ', content)
            # 调用cont_from_str进行处理
            return self.count_from_str(content, top_limit=top_limit)

    # 参数为待处理的内容，以及输出词汇个数
    def count_from_str(self, content, top_limit=0):
        # 如果输出词汇个数不合法，将重置为100
        if top_limit <= 0:
            top_limit = 100
        # 提取前100个关键词
        tags = jieba.analyse.extract_tags(content, topK=100)
        # 进行搜索引擎分词
        words = jieba.cut_for_search(content)
        # 初始化计数器
        counter = Counter()
        # 遍历分词的词语，并进行计数
        for word in words:
            # 如果分词项在关键词中，该关键词计数器+1
            if word in tags:
                counter[word] += 1
        # 从大到小返回前top_limit个元素
        return counter.most_common(top_limit)


if __name__ == '__main__':
    counter = WordCounter()
    result = counter.count_from_file('./射雕英雄传.txt', top_limit=10)
    # 如果不需要显示关键词次数，可以把print里的v去掉
    for k, v in result:
        print(k, v)
